home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-03 / qbxsnd11.zip / QBXSND11.DOC < prev    next >
Text File  |  1991-10-22  |  23KB  |  739 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.                                      QBXSOUND
  12.  
  13.  
  14.     The AdLib/MIDI Music Player and Sound Blaster/VOC Digital Input and
  15.     Output Recorder and Player for QuickBASIC/BASIC Professional Development
  16.     System Compilers.
  17.  
  18.  
  19.  
  20.                              Version 1.01, 22-Oct-1991
  21.                    (C)1991 Cornel Huth -- All Rights Reserved.
  22.  
  23.  
  24.  
  25.     Version 1.01, released just a day after the initial release, fixes the
  26.     problem that plaqued the first version--you can now play music in the
  27.     background while in the QB4b/4.5 environment. My thanks to Mr. Sandman.
  28.          
  29.  
  30.     QBXSOUND is a complete sound development system for the AdLib and Sound
  31.     Blaster sound cards. It requires QuickBASIC version 4.0a or above, or
  32.     QBX/BC 7.0 PDS or above. No other software/drivers are required. The
  33.     music is played in the background allowing you to perform other tasks
  34.     while the music plays. The digital input/output routines use DMA program-
  35.     ming techniques allowing you to play music, output a digital VOC track,
  36.     and perform other tasks such as screen updating, etc., ALL AT THE SAME
  37.     TIME. You won't find this capability anywhere, for any price, except in
  38.     QBXSOUND for QB/PDS.
  39.  
  40.     QBXSOUND as you have received it consists of 3 QLBs. These are for
  41.     QuickBASIC 4.0b, 4.5, and QBX 7.1. You may use these QLBs for your
  42.     personal use without registering. However, in order to create .EXE
  43.     program files you must register to get the required link libraries.
  44.  
  45.     To REGISTER see the !ORDER file or use the order form included within
  46.     this document.
  47.  
  48.     Most of you will probably have .ROL files rather than MIDI-compatible
  49.     files. No problem. Use the supplied ROL2MIDI.EXE converter (courtesy
  50.     AdLib, Inc.). This translates the .ROL music file and its .BNK-instrument
  51.     file into a single, MIDI-compatible format file. The instrument-change
  52.     data is put directly within the MIDI file. This means you can distribute
  53.     music files without bothering with the huge, and mostly unused, instru-
  54.     ment bank file.
  55.  
  56.     To convert any .ROL file to MIDI:
  57.  
  58.         C>ROL2MIDI filename /Bbankfile /Onewfile
  59.  
  60.     For example, to convert MANALISH.ROL to MANALISH.MDI using the standard
  61.     instrument bankfile:
  62.  
  63.         C>ROL2MIDI manalish.rol /Bstandard.bnk /Omanalish.mdi
  64.  
  65.  
  66.  
  67.     This shareware release of QBXSOUND documents the high-level MIDI music
  68.     and VOC input/output routines. In all, just 13 routines:
  69.  
  70.         MusicInit(), MusicInfo(), MusicPlay(), MusicPause(), MusicCont(), and
  71.         MusicEnd() for playing MIDI music files via the AdLib or Sound
  72.         Blaster;
  73.  
  74.         VOCinit(), VOCinfo(), VOCplay(), VOCrecord(), VOCpause(), VOCcont(),
  75.         and VOCend() for playing and recording digital files via the Sound
  76.         Blaster.
  77.  
  78.     There are 66 additional routines that are available in the Professional-
  79.     level package. See the included QBXSOUND.BI file for a listing sampler.
  80.  
  81.  
  82.  
  83.                              QBXSOUND v1.0 ORDER FORM
  84.  
  85.                                                    Qty     Extended
  86.  
  87.     QBXSOUND v1.0 Programmer version. . . $ 9.95 x _____ = __________
  88.  
  89.     - link LIB for QuickBASIC 4.0a, 4.0b, 4.5 ONLY
  90.     - Programmer's edition manual, on disk
  91.  
  92.                  -OR-
  93.  
  94.     QBXSOUND v1.0 Professional version . .$49.95 x _____ = __________
  95.  
  96.     - link LIBs for QuickBASIC 4.0a, 4.0b, 4.5, and QBX/BC 7.x
  97.     - all BASIC source code included
  98.     - Professional edition printed manual, bound
  99.  
  100.                                                 Subtotal:  __________
  101.  
  102.             (Texas residents only add 8.25%)   Sales tax:  __________
  103.  
  104.     SHIPPING COSTS   USA   CAN   Foreign  Shipping costs:  __________
  105.     Programmer    : none  $1.00  $ 2.00
  106.     Professional  : none   5.00    5.00            TOTAL: $
  107.                                                            ==========
  108.  
  109.     Please remit TOTAL amount in US funds on US bank only, to:
  110.  
  111.         Cornel Huth
  112.         6402 Ingram Rd.
  113.         San Antonio, Texas  78238  U.S.A.
  114.  
  115.     Disk will be 5.25-inch 360K unless otherwise requested. Add $1.00 for
  116.     3.5-inch disk.
  117.  
  118.  
  119.     Name: ___________________________________________________________
  120.  
  121.     Mailing address: ________________________________________________
  122.  
  123.     _________________________________________________________________
  124.  
  125.     _________________________________________________________________
  126.  
  127.     _________________________________________________________________
  128.  
  129.     Special instructions or comments (continue on reverse if needed):
  130.  
  131.  
  132.  
  133.     Please indicate how you obtained QBXSND 1.0. If from a BBS please
  134.     indicate which one and its telephone number:
  135.     _________________________________________________________________
  136.  
  137.     BBS:_____________________________ Tele: (     )______-___________
  138.  
  139.  
  140.  
  141.     Routines used to control play of a MIDI music file:
  142.  
  143.     DECLARE FUNCTION MusicInit (useEvent%)
  144.     DECLARE FUNCTION MusicPlay% (MBseg%, MBoff%)
  145.     DECLARE FUNCTION MusicInfo%(voice%,note%,volume%,mode%,MusicPtr&)
  146.     DECLARE SUB MusicPause ()
  147.     DECLARE SUB MusicCont ()
  148.     DECLARE SUB MusicEnd ()
  149.  
  150.  
  151.     Routines used to control play of a VOC digital file:
  152.  
  153.     DECLARE FUNCTION VOCinit% (port%, IRQ%, DMA%)
  154.     DECLARE FUNCTION VOCinfo% (CurrBlockType%, CurrSampleRate%)
  155.     DECLARE FUNCTION VOCplay% (VBseg%, VBoff%)
  156.     DECLARE FUNCTION VOCrecord% (SampleRate%, bytes&, VBseg%, VBoff%)
  157.     DECLARE SUB VOCpause% ()
  158.     DECLARE SUB VOCcont% ()
  159.     DECLARE SUB VOCend% ()
  160.  
  161.     Note that the Sound Blaster will play both music and VOC. The AdLib,
  162.     however, will only play music.
  163.  
  164.     Note that the Music() routines use the UEVENT handler that is available
  165.     only in QuickBASIC versions 4.0a and above. This Microsoft routine was
  166.     not available in the initial release of QuickBASIC 4.00. To see what
  167.     version you have, run your BC compiler. If it says 'Compiler Version
  168.     4.00a' or above then your compiler is sufficient to use QBXSOUND.
  169.  
  170.     Note that the Music() routines use the UEVENT handler. Since other code
  171.     may also be using the UEVENT signal, QBXSOUND first checks to make sure
  172.     that the UEVENT triggered is for QBXSOUND. If not, control can be passed
  173.     to another handler, e.g., your specialized mouse handler, or other
  174.     handler. This is available only in the Professional-level package.
  175.  
  176.     It is not necessary for you to understand what UEVENT is, but you should
  177.     be aware that it is being used. When compiling, you need to include the
  178.     /V switch.
  179.  
  180.  
  181.  
  182.     MUSICINIT
  183.  
  184.     TYPE          FUNCTION
  185.  
  186.     SYNTAX        stat = MusicInit(UseEVENT)
  187.  
  188.     PARAMETERS    UseEVENT - INTEGER. Determine if music is to be played in
  189.                   the background.
  190.  
  191.     USE           If UseEVENT is non-zero then UEVENT trapping is used,
  192.                   allowing the music to be played in the background. If
  193.                   UseEVENT = 0 then the music is played in the foreground.
  194.                   The difference is very apparent: With UseEVENT non-zero,
  195.                   MusicPlay() returns immediately; with UseEVENT = 0,
  196.                   MusicPlay() will not return until the music is over.
  197.  
  198.     RULES         This routine must be called before any other Music()
  199.                   routine.
  200.  
  201.     NOTES         Setting UseEVENT=0 can make debugging easier, especially if
  202.                   you're using CodeView.
  203.  
  204.                   The previous verison could not play music in the background
  205.                   while in the QB 4b/4.5 environment. This has been fixed.
  206.  
  207.     RETURN        0=FM music chip tests okay
  208.                   1=AdLib-compatible test failed
  209.  
  210.     EXAMPLE       IF DEBUG THEN UseEVENT = 0 ELSE UseEVENT = 1
  211.                   stat = MusicInit(UseEVENT)
  212.                   IF stat THEN DoNoAdLibCard
  213.  
  214.  
  215.  
  216.     MUSICPLAY
  217.  
  218.     TYPE          FUNCTION
  219.  
  220.     SYNTAX        stat = MusicPlay(MBseg,MBoff)
  221.  
  222.     PARAMETERS    MBseg - INTEGER. Segment address of music buffer.
  223.  
  224.                   MBoff - INTEGER. Offset address of music buffer.
  225.  
  226.     USE           Initiate the playing of the music data in the memory buffer
  227.                   pointed to by MBseg:MBoff. MBseg and MBoff are determined
  228.                   by using the BASIC functions VARSEG() and VARPTR().
  229.  
  230.     RULES         The music buffer must contain no more than 65,520 bytes of
  231.                   data, i.e., the MIDI filesize must not be larger than 65520
  232.                   bytes (about 5-20 minutes of music). It is recommended that
  233.                   the buffer be created as an array. This ensures that the
  234.                   offset will start at 0.
  235.  
  236.     NOTES         An easy way to set up a music buffer is to TYPE a variable
  237.                   as STRING * 8192 and then allocate an array of from 1 to 8
  238.                   of those, depending on what's required. See the example.
  239.  
  240.     RETURN        Always 1.
  241.  
  242.     EXAMPLE       TYPE BigChunkTYPE
  243.                   BigChunk AS STRING * 8192
  244.                   END TYPE
  245.  
  246.                   REDIM SHARED mbuff(1 TO 1) AS BigChunkTYPE
  247.                   OPEN midifile$ FOR BINARY AS #1
  248.                   length& = LOF(1)
  249.                   IF length& > 65520 THEN ERROR 7
  250.  
  251.                   blocks = (length& \ 8192)
  252.                   IF length& MOD 8192 THEN blocks = blocks + 1
  253.                   REDIM mbuff(1 TO blocks) AS BigChunkTYPE
  254.  
  255.                   ss = 1              'read 8K of the file at a time
  256.                   DO WHILE NOT EOF(1)
  257.                      GET #1, , mbuff(ss).BigChunk
  258.                      ss = ss + 1
  259.                   LOOP
  260.                   CLOSE #1
  261.  
  262.                   MBseg = VARSEG(mbuff(1))
  263.                   MBoff = VARPTR(mbuff(1))
  264.  
  265.                   stat = MusicPlay(MBseg, MBoff)
  266.  
  267.  
  268.  
  269.     MUSICINFO
  270.  
  271.     TYPE          FUNCTION
  272.  
  273.     SYNTAX        stat = MusicInfo(voice,note,volume,mode,MusicPtr&)
  274.  
  275.     PARAMETERS    voice - INTEGER. Determine which voice to get info on.
  276.  
  277.                   note - INTEGER. Returned last note output of voice (range
  278.                   0-127).
  279.  
  280.                   volume - INTEGER. Returned last volume level of voice
  281.                   (range 0-127).
  282.  
  283.                   mode - INTEGER. Returned current FM chip mode (0 or 1).
  284.  
  285.                   MusicPtr& - LONG. Returned current byte pointer into the
  286.                   music data that is being played.
  287.  
  288.     USE           Obtain basic information on the state of the music file
  289.                   being played.
  290.  
  291.     RULES         None.
  292.  
  293.     NOTES         This routine needs to be called to determine if the MIDI
  294.                   data is still being played.
  295.  
  296.                   Mode 0 is melodic mode where there are 9 voices available
  297.                   (0-8). Mode 1 is percussive mode where 6 melodic voice are
  298.                   available plus 5 percussive voices (0-5 plus bass drum,
  299.                   snare drum, tom-tom, top-cymbal, and hi-hat).
  300.  
  301.     RETURN        0 music is done playing
  302.                   1 music is still playing
  303.                   -1 if voice invalid
  304.  
  305.     EXAMPLE       'determine the last note and volume played by each voice
  306.                   'music already started
  307.                   stat = MusicInfo(voice,note,vol,mode,musicptr&)
  308.                   IF mode = 0 THEN MaxVoice = 8 ELSE MaxVoice = 10
  309.                   DO
  310.                      FOR i = 0 TO MaxVoice
  311.                         stat = MusicInfo(i,note,vol,mode,musicptr&)
  312.                         PRINT "Voice:";i;" Vol:";vol;" Note:";note
  313.                      NEXT
  314.                   LOOP UNTIL stat = 0
  315.                   'wait until the music is done before ending
  316.                   END
  317.  
  318.  
  319.  
  320.     MUSICPAUSE
  321.  
  322.     TYPE          SUB
  323.  
  324.     SYNTAX        MusicPause
  325.  
  326.     PARAMETERS    None.
  327.  
  328.     USE           Pause the music output temporarily.
  329.  
  330.     RULES         None.
  331.  
  332.     NOTES         This routine is useful if you are using any code that uses
  333.                   DEF SEG =. For instance, if you are reading/writing to the
  334.                   video screen using peeks and pokes with DEF SEG to point to
  335.                   and from your screen buffer and the video screen, you
  336.                   should first MusicPause() and then, when you're done using
  337.                   DEF SEG, use MusicCont(). If you keep the time short you
  338.                   may not even notice the pause.
  339.  
  340.                   Any time you get input via BASIC's INPUT routine the music
  341.                   is automatically paused. It continues when INPUT is
  342.                   received.
  343.  
  344.     RETURNS       Nothing.
  345.  
  346.     EXAMPLE       'music is already playing
  347.                   DO
  348.                      a$ = INKEY$
  349.                      IF a$ = "p" THEN MusicPause
  350.                      IF a$ = "c" THEN MusicCont
  351.                      IF a$ = "x" THEN MusicEnd
  352.                   LOOP
  353.  
  354.  
  355.  
  356.     MUSICCONT
  357.  
  358.     TYPE          SUB
  359.  
  360.     SYNTAX        MusicCont
  361.  
  362.     PARAMETERS    None.
  363.  
  364.     USE           Continue the music output if paused.
  365.  
  366.     RULES         None.
  367.  
  368.     NOTES         See MusicPause.
  369.  
  370.     RETURNS       Nothing.
  371.  
  372.     EXAMPLE       'music is already playing
  373.                   DO
  374.                      a$ = INKEY$
  375.                      IF a$ = "p" THEN MusicPause
  376.                      IF a$ = "c" THEN MusicCont
  377.                      IF a$ = "x" THEN MusicEnd
  378.                   LOOP
  379.  
  380.  
  381.  
  382.     MUSICEND
  383.  
  384.     TYPE          SUB
  385.  
  386.     SYNTAX        MusicEnd
  387.  
  388.     PARAMETERS    None.
  389.  
  390.     USE           Shut down the music player.
  391.  
  392.     RULES         This routine should be called before ending your program.
  393.  
  394.     NOTES         None.
  395.  
  396.     RETURNS       Nothing.
  397.  
  398.     EXAMPLE       'music is already playing
  399.                   DO
  400.                      a$ = INKEY$
  401.                      IF a$ = "p" THEN MusicPause
  402.                      IF a$ = "c" THEN MusicCont
  403.                      IF a$ = "x" THEN MusicEnd
  404.                   LOOP
  405.  
  406.  
  407.  
  408.     VOCINIT
  409.  
  410.     TYPE          FUNCTION
  411.  
  412.     SYNTAX        stat = VOCinit(port,IRQ,DMA)
  413.  
  414.     PARAMETERS    port - INTEGER. Determine what port to use, or to auto-
  415.                   check Sound Blaster configuration.
  416.  
  417.                   IRQ - INTEGER. Determine what IRQ to use, or to auto-check
  418.                   Sound Blaster configuration.
  419.  
  420.                   DMA - INTEGER. Determine what DMA channel to use.
  421.  
  422.     USE           If either port or IRQ is 0 then QBXSOUND will automatically
  423.                   determine the configuration of the Sound Blaster card. If
  424.                   neither is 0 then the port and IRQ supplied will be used to
  425.                   determine if the Sound Blaster is installed.
  426.  
  427.                   Currently the Sound Blaster supports only DMA channel 1.
  428.  
  429.     RULES         This routine must be called before any other VOC() routine.
  430.  
  431.     NOTES         If you want to know the configuration of the Sound Blaster
  432.                   see the example below.
  433.  
  434.     RETURN        0=Sound Blaster digital I/O tests okay
  435.                   1=no Sound Blaster
  436.                   2=IRQ test fails
  437.                   3=DMA test fails
  438.  
  439.     EXAMPLE       port = 0 : IRQ = 0 : DMA = 1
  440.                   stat = VOCinit(port,IRQ,DMA)
  441.                   IF stat = 0 THEN
  442.                      PRINT "SB at port:";port;" IRQ:";IRQ
  443.                   ELSE
  444.                      PRINT "SB failed";stat
  445.                   ENDIF
  446.  
  447.  
  448.  
  449.     VOCPLAY
  450.  
  451.     TYPE          FUNCTION
  452.  
  453.     SYNTAX        stat = VOCplay(VBseg,VBoff)
  454.  
  455.     PARAMETERS    VBseg - INTEGER. Segment address of VOC buffer.
  456.  
  457.                   VBoff - INTEGER. Offset address of VOC buffer.
  458.  
  459.     USE           Initiate the playing of the digital VOC data in the memory
  460.                   buffer pointed to by VBseg:MBoff. VBseg and VBoff are
  461.                   determined by using the BASIC functions VARSEG() and
  462.                   VARPTR().
  463.  
  464.     RULES         The VOC buffer may be any size available.
  465.  
  466.     NOTES         An easy way to set up a VOC buffer is to TYPE a variable as
  467.                   STRING * 8192 and then allocate an array of those, depend-
  468.                   ing on what's required. See the example. If you plan on
  469.                   having a buffer larger than 64K be sure to startup QB with
  470.                   the /AH switch. Same goes for BC.
  471.  
  472.                   The data at VBseg:VBoff should have a valid VOXKIT header,
  473.                   as created by VOXKIT itself, or by the VOC-HDR program
  474.                   (both came with your Sound Blaster).
  475.  
  476.     RETURN        0=okay
  477.                   1=voice already being output (busy)
  478.  
  479.     EXAMPLE       TYPE BigChunkTYPE
  480.                   BigChunk AS STRING * 8192
  481.                   END TYPE
  482.  
  483.                   OPEN vocfile$ FOR BINARY AS #1
  484.                   length& = LOF(1)
  485.  
  486.                   blocks = (length& \ 8192)
  487.                   IF length& MOD 8192 THEN blocks = blocks + 1
  488.                   REDIM vbuff(1 TO blocks) AS BigChunkTYPE
  489.  
  490.                   ss = 1              'read 8K of the file at a time
  491.                   DO WHILE NOT EOF(1)
  492.                      GET #1, , vbuff(ss).BigChunk
  493.                      ss = ss + 1
  494.                   LOOP
  495.                   CLOSE #1
  496.  
  497.                   VBseg = VARSEG(vbuff(1))
  498.                   VBoff = VARPTR(vbuff(1))
  499.                   stat = VOCplay(VBseg, VBoff)
  500.  
  501.  
  502.  
  503.     VOCRECORD
  504.  
  505.     TYPE          FUNCTION
  506.  
  507.     SYNTAX        stat = VOCrecord(SampleRate,bytes&,VBseg,VBoff)
  508.  
  509.     PARAMETERS    SampleRate - INTEGER. The rate at which to sample the
  510.                   recording at.
  511.  
  512.                   bytes& - LONG. The number of bytes& to record.
  513.  
  514.                   VBseg - INTEGER. Segment address of VOC buffer.
  515.  
  516.                   VBoff - INTEGER. Offset address of VOC buffer.
  517.  
  518.     USE           Initiate the recording of digital data into the memory
  519.                   buffer pointed to by VBseg:MBoff for the number of bytes&.
  520.                   VBseg and VBoff are determined by using the BASIC functions
  521.                   VARSEG() and VARPTR().
  522.  
  523.     RULES         The VOC buffer may be any size available but at least the
  524.                   size of bytes&.
  525.  
  526.                   SampleRate may be 5000 to 11000 (samples/second).
  527.  
  528.     NOTES         Time of recording is bytes& / SampleRate.
  529.  
  530.                   An easy way to set up a VOC buffer is to TYPE a variable as
  531.                   STRING * 8192 and then allocate an array of those, depend-
  532.                   ing on what's required. See the example. If you plan on
  533.                   having a buffer larger than 64K be sure to startup QB with
  534.                   the /AH switch. Same goes for BC.
  535.  
  536.                   QBXSOUND will place the data recorded at VBseg:VBoff. This
  537.                   will be the data itself--no header is built. VOCplay() will
  538.                   play this data even without the VOXKIT header.
  539.  
  540.     RETURN        0=okay
  541.                   1=voice already being output (busy)
  542.  
  543.     EXAMPLE       secs = 10 : SR = 11000   'sample at 11kHz for 10 seconds
  544.                   bytes& = 1& * secs * SR  '110,000 bytes
  545.  
  546.                   blocks = (bytes& \ 8192)
  547.                   IF bytes& MOD 8192 THEN blocks = blocks + 1
  548.                   REDIM vbuff(1 TO blocks) AS BigChunkTYPE
  549.  
  550.                   INPUT "Press <Enter> to record";a$
  551.                   VBseg = VARSEG(vbuff(1)) : VBoff = VARPTR(vbuff(1))
  552.                   stat = VOCrecord(SR,bytes&,VBseg, VBoff)
  553.  
  554.                   DO
  555.                      stat = VOCinfo(CBT,CSR)  'wait until done recording
  556.                   LOOP UNTIL stat = 0
  557.  
  558.                   INPUT "Press <Enter> to playback";a$
  559.                   stat = VOCplay(VBseg,VBoff) 'play it back
  560.                   DO:LOOP UNTIL VOCinfo(CBT,CSR) = 0
  561.                   END
  562.  
  563.  
  564.  
  565.     VOCINFO
  566.  
  567.     TYPE          FUNCTION
  568.  
  569.     SYNTAX        stat = VOCinfo(CurrBlockType,CurrSampleRate)
  570.  
  571.     PARAMETERS    CurrBlockType - INTEGER. Returned block type.
  572.  
  573.                   CurrSampleRate - INTEGER. Returned sample rate.
  574.  
  575.     USE           Obtain basic information on the state of the VOC data being
  576.                   output.
  577.  
  578.     RULES         None.
  579.  
  580.     NOTES         This routine needs to be called to determine if the VOC
  581.                   data is still being output.
  582.  
  583.                   The block type and sample rate are explained in the Profes-
  584.                   sional package.
  585.  
  586.     RETURN        0 VOC is over
  587.                   1 VOC is being output
  588.  
  589.     EXAMPLE       'determine when the VOC data is done
  590.                   'VOC already started
  591.                   DO
  592.                      stat = VOCinfo(CBT,CSR)
  593.                      IF stat THEN DoSomethingElse
  594.                   LOOP UNTIL stat = 0
  595.  
  596.  
  597.  
  598.     VOCPAUSE
  599.  
  600.     TYPE          SUB
  601.  
  602.     SYNTAX        VOCpause
  603.  
  604.     PARAMETERS    None.
  605.  
  606.     USE           Pause the VOC output temporarily.
  607.  
  608.     RULES         None.
  609.  
  610.     NOTES         None.
  611.  
  612.     RETURNS       Nothing.
  613.  
  614.     EXAMPLE       'VOC is already playing
  615.                   DO
  616.                      a$ = INKEY$
  617.                      IF a$ = "p" THEN VOCpause
  618.                      IF a$ = "c" THEN VOCcont
  619.                      IF a$ = "x" THEN VOCend
  620.                   LOOP
  621.  
  622.  
  623.  
  624.     VOCCONT
  625.  
  626.     TYPE          SUB
  627.  
  628.     SYNTAX        VOCcont
  629.  
  630.     PARAMETERS    None.
  631.  
  632.     USE           Continue the VOC output if paused.
  633.  
  634.     RULES         None.
  635.  
  636.     NOTES         See VOCpause.
  637.  
  638.     RETURNS       Nothing.
  639.  
  640.     EXAMPLE       'VOC is already playing
  641.                   DO
  642.                      a$ = INKEY$
  643.                      IF a$ = "p" THEN VOCpause
  644.                      IF a$ = "c" THEN VOCcont
  645.                      IF a$ = "x" THEN VOCend
  646.                   LOOP
  647.  
  648.  
  649.  
  650.     VOCEND
  651.  
  652.     TYPE          SUB
  653.  
  654.     SYNTAX        VOCend
  655.  
  656.     PARAMETERS    None.
  657.  
  658.     USE           Shut down the VOC player.
  659.  
  660.     RULES         This routine should be called before ending your program.
  661.  
  662.     NOTES         None.
  663.  
  664.     RETURNS       Nothing.
  665.  
  666.     EXAMPLE       'VOC is already playing
  667.                   DO
  668.                      a$ = INKEY$
  669.                      IF a$ = "p" THEN VOCpause
  670.                      IF a$ = "c" THEN VOCcont
  671.                      IF a$ = "x" THEN VOCend
  672.                   LOOP
  673.  
  674.  
  675.  
  676.     End of document, shareware edition.
  677.     QBXSOUND
  678.     Version 1.0, 21-Oct-1991
  679.     (C)1991 Cornel Huth -- All Rights Reserved.
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.